heat_template_version: 2013-05-23

description: heat template that creates MOG stack

parameters:
  pd_server_names:
    type: comma_delimited_list
    label: PD server names
    description: name of the PD instance
  pd_image_name:
    type: string
    label: image name
    description: PD image name
  pd_flavor_name:
    type: string
    label: PD flavor name
    description: flavor name of PD instance
  oam_server_names:
    type: comma_delimited_list
    label: OAM server names
    description: name of the OAM instance
  oam_image_name:
    type: string
    label: image name
    description: OAM image name
  oam_flavor_name:
    type: string
    label: OAM flavor name
    description: flavor name of OAM instance
  sm_server_names:
    type: comma_delimited_list
    label: SM server names
    description: name of the SM instance
  sm_image_name:
    type: string
    label: image name
    description: SM image name
  sm_flavor_name:
    type: string
    label: SM flavor name
    description: flavor name of SM instance
  ps_server_names:
    type: comma_delimited_list
    label: PS server names
    description: name of the PS instance
  ps_image_name:
    type: string
    label: PS image name
    description: PS image name
  ps_flavor_name:
    type: string
    label: PS flavor name
    description: flavor name of PS instance
  cm_server_names:
    type: comma_delimited_list
    label: CM server names
    description: name of the CM instance
  cm_image_name:
    type: string
    label: image name
    description: CM image name
  cm_flavor_name:
    type: string
    label: CM flavor name
    description: flavor name of CM instance
  availabilityzone_name:
    type: string
    label: availabilityzone name
    description: availabilityzone name
  oam_net_name:
    type: string
    label: oam network name
    description: name of the oam network
  oam_net_ips:
    type: comma_delimited_list
    label: internet network ips
    description: ip of the OAM network
 # internet_net_name:
 #   type: string
 #   label: internet network name
 #   description: id of the internet network
 # internet_net_ips:
 #   type: comma_delimited_list
 #   label: internet network ips
 #   description: ip of the internet network
 # internet_net_floating_ip:
 #   type: string
 #   label: mog internet virtual ip
 #   description: mog internet virtual ip
  sl_net_name:
    type: string
    label: silver lining network name
    description: id of the sl network
  sl_net_ips:
    type: comma_delimited_list
    label: silver lining network ips
    description: ips of the sl network
  sl_net_floating_ip:
    type: string
    label: mog sl net virtual ip
    description: mog sl net virtual ip
  repl_net_name:
    type: string
    label: Replication network name
    description: name of the replication network
  repl_net_ips:
    type: comma_delimited_list
    label: repl network ips
    description: ips of repl network
  rx_net_name:
    type: string
    label: Rx network name
    description: Rx network name
  rx_net_ips:
    type: comma_delimited_list
    label: Rx network ips
    description: Rx network ips
  rx_net_floating_ip:
    type: string
    label: mog rx net virtual ip
    description: mog rx net virtual ip
  ran_net_name:
    type: string
    label: RAN network name
    description: RAN network name
  ran_net_ips:
    type: comma_delimited_list
    label: RAN network ips
    description: RAN network ip
  ran_net_floating_ip:
    type: string
    label: mog ran net virtual ip
    description: mog ran net virtual ip
  csb_net_name:
    type: string
    label: csb internal network name
    description: csb internal network name
  csb_net_start:
    type: string
    label: csb internal start
    description: csb internal start
  csb_net_end:
    type: string
    label: csb internal end
    description: csb internal end
  csb_net_cidr:
    type: string
    label: csb ineternal cidr
    description: csb internal cidr
  csb_net_netmask:
    type: string
    description: CSB internal network subnet mask
  csb_net_ips:
    type: comma_delimited_list
    description: mog_csb_net IP addresses
  dummy_net_name_0:
    type: string
    label: csb internal network name
    description: csb internal network name
  dummy_net_start_0:
    type: string
    label: csb internal start
    description: csb internal start
  dummy_net_end_0:
    type: string
    label: csb internal end
    description: csb internal end
  dummy_net_cidr_0:
    type: string
    label: csb ineternal cidr
    description: csb internal cidr
  dummy_net_netmask_0:
    type: string
    description: CSB internal network subnet mask
  dummy_net_name_1:
    type: string
    label: csb internal network name
    description: csb internal network name
  dummy_net_start_1:
    type: string
    label: csb internal start
    description: csb internal start
  dummy_net_end_1:
    type: string
    label: csb internal end
    description: csb internal end
  dummy_net_cidr_1:
    type: string
    label: csb ineternal cidr
    description: csb internal cidr
  dummy_net_netmask_1:
    type: string
    description: CSB internal network subnet mask

  security_group_name:
    type: string
    label: security group name
    description: the name of security group
  cluster-manager-vol-1:
    type: string
    label: mog-cm-vol-1
    description: Cluster Manager volume 1
  session-manager-vol-1:
    type: string
    label: mog-sm-vol-1
    description: Session Manager volume 1
  session-manager-vol-2:
    type: string
    label: mog-sm-vol-2
    description: Session Manager volume 2
  oam-vol-1:
    type: string
    label: mog-oam-vol-1
    description: OAM volume 1
  oam-vol-2:
    type: string
    label: mog-oam-vol-2
    description: OAM volume 2
  mog_swift_container:
    type: string
    label: mog Config URL
    description: Config URL
  mog_script_dir:
    type: string
    label: mog Config script directory
    description: Config script directory
  mog_script_name:
    type: string
    label: mog Config script name
    description: Config script name
  mog_parameter_name:
    type: string
    label: mog script parameter name
    description: Config script parameter csv file name
  cluster-manager-vol-2:
    type: string
    label: mog-cm-vol-2
    description: Cluster Manager volume 2 with ISO image

resources:
  mog_security_group:
    type: OS::Neutron::SecurityGroup
    properties:
      description: mog security group
      name: {get_param: security_group_name}
      rules: [{"direction": egress, "ethertype": IPv4, "port_range_min": 1, "port_range_max": 65535, "protocol": tcp, "remote_ip_prefix": 0.0.0.0/0},
              {"direction": egress, "ethertype": IPv4, "port_range_min": 1, "port_range_max": 65535, "protocol": udp, "remote_ip_prefix": 0.0.0.0/0},
              {"direction": egress, "ethertype": IPv4, "protocol": icmp, "remote_ip_prefix": 0.0.0.0/0},
              {"direction": ingress, "ethertype": IPv4, "port_range_min": 1, "port_range_max": 65535, "protocol": tcp, "remote_ip_prefix": 0.0.0.0/0},
              {"direction": ingress, "ethertype": IPv4, "port_range_min": 1, "port_range_max": 65535, "protocol": udp, "remote_ip_prefix": 0.0.0.0/0},
              {"direction": ingress, "ethertype": IPv4, "protocol": icmp, "remote_ip_prefix": 0.0.0.0/0}
              ]

  csb_net:
    type: OS::Contrail::VirtualNetwork
    properties:
      name: { get_param: csb_net_name}

  csb_ip_subnet:
    type: OS::Neutron::Subnet
    properties:
      name: {get_param: csb_net_name}
      network_id: { get_resource: csb_net }
      cidr: { get_param: csb_net_cidr }
      allocation_pools: [{"start": {get_param: csb_net_start}, "end": {get_param: csb_net_end}}]
      enable_dhcp: true

  dummy_net_0:
    type: OS::Contrail::VirtualNetwork
    properties:
      name: { get_param: dummy_net_name_0}

  dummy_ip_subnet_0:
    type: OS::Neutron::Subnet
    properties:
      name: {get_param: dummy_net_name_0}
      network_id: { get_resource: dummy_net_0 }
      cidr: { get_param: dummy_net_cidr_0 }
      allocation_pools: [{"start": {get_param: dummy_net_start_0}, "end": {get_param: dummy_net_end_0}}]
      enable_dhcp: true

  dummy_net_1:
    type: OS::Contrail::VirtualNetwork
    properties:
      name: { get_param: dummy_net_name_1}

  dummy_ip_subnet_1:
    type: OS::Neutron::Subnet
    properties:
      name: {get_param: dummy_net_name_1}
      network_id: { get_resource: dummy_net_1 }
      cidr: { get_param: dummy_net_cidr_1 }
      allocation_pools: [{"start": {get_param: dummy_net_start_1}, "end": {get_param: dummy_net_end_1}}]
      enable_dhcp: true


  mogconfig:
    type: OS::Heat::SoftwareConfig
    properties:
      group: ungrouped
      config:
        str_replace:
          template: |
            #!/bin/bash
            wget -P script_dir swift_container/script_name
            wget -P script_dir swift_container/parameter_name
            chmod 755 script_dir/script_name
            script_dir/script_name
          params:
            swift_container: {get_param: mog_swift_container}
            script_dir: {get_param: mog_script_dir}
            script_name: {get_param: mog_script_name}
            #parameter_name: {get_param: mog_parameter_name}


  servergroup_mog01:
    type: OS::Nova::ServerGroup
    properties:
      policies:
        - anti-affinity
  server_pd_01:
    type: OS::Nova::Server
    properties:
#      config_drive: "True"
      name: {get_param: [pd_server_names, 0]}
      image: {get_param: pd_image_name}
      flavor: {get_param: pd_flavor_name}
      availability_zone: {get_param: availabilityzone_name}
      networks:
        - port: {get_resource: pd01_port_0}
        - port: {get_resource: pd01_port_1}
        - port: {get_resource: pd01_port_2}
        - port: {get_resource: pd01_port_3}
        - port: {get_resource: pd01_port_4}
        - port: {get_resource: pd01_port_5}
        - port: {get_resource: pd01_port_6}
     #   - port: {get_resource: pd01_port_7}
      user_data:
      scheduler_hints: {group: {get_resource: servergroup_mog01}}
      user_data_format:  RAW


  pd01_port_0:
    type: OS::Neutron::Port
    properties:
      network: {get_resource: csb_net}
      security_groups: [{get_resource: mog_security_group}]
  pd01_port_1:
    type: OS::Neutron::Port
    properties:
      network: {get_param: oam_net_name}
      fixed_ips: [{"ip_address": {get_param: [oam_net_ips, 0]}}]
      security_groups: [{get_resource: mog_security_group}]
  pd01_port_2:
    type: OS::Neutron::Port
    properties:
      network: {get_resource: dummy_net_0}
      security_groups: [{get_resource: mog_security_group}]
  pd01_port_3:
    type: OS::Neutron::Port
    properties:
      network: {get_param: rx_net_name}
      fixed_ips: [{"ip_address": {get_param: [rx_net_ips, 0]}}]
      allowed_address_pairs: [{"ip_address": {get_param: rx_net_floating_ip} }]
      security_groups: [{get_resource: mog_security_group}]
  pd01_port_4:
    type: OS::Neutron::Port
    properties:
      network: {get_resource: dummy_net_1}
      security_groups: [{get_resource: mog_security_group}]
  pd01_port_5:
    type: OS::Neutron::Port
    properties:
      network: {get_param: ran_net_name}
      fixed_ips: [{"ip_address": {get_param: [ran_net_ips, 0]}}]
      allowed_address_pairs: [{"ip_address": {get_param: ran_net_floating_ip} }]
      security_groups: [{get_resource: mog_security_group}]

  pd01_port_6:
    type: OS::Neutron::Port
    properties:
      network: {get_param: sl_net_name}
      fixed_ips: [{"ip_address": {get_param: [sl_net_ips, 0]}}]
      allowed_address_pairs: [{"ip_address": {get_param: sl_net_floating_ip}}]
      security_groups: [{get_resource: mog_security_group}]

 # pd01_port_7:
 #j   type: OS::Neutron::Port
 #   properties:
 #     network: {get_param: internet_net_name}
 #     fixed_ips: [{"ip_address": {get_param: [internet_net_ips, 0]}}]
 #     allowed_address_pairs: [{"ip_address": {get_param: internet_net_floating_ip} }]
 #    security_groups: [{get_resource: mog_security_group}]

  server_pd_02:
    type: OS::Nova::Server
    properties:
#      config_drive: "True"
      name: {get_param: [pd_server_names, 1]}
      image: {get_param: pd_image_name}
      flavor: {get_param: pd_flavor_name}
      availability_zone: {get_param: availabilityzone_name}
      networks:
        - port: {get_resource: pd02_port_0}
        - port: {get_resource: pd02_port_1}
        - port: {get_resource: pd02_port_2}
        - port: {get_resource: pd02_port_3}
        - port: {get_resource: pd02_port_4}
        - port: {get_resource: pd02_port_5}
        - port: {get_resource: pd02_port_6}
      #  - port: {get_resource: pd02_port_7}

      user_data:
      scheduler_hints: {group: {get_resource: servergroup_mog01}}
      user_data_format:  RAW

  pd02_port_0:
    type: OS::Neutron::Port
    properties:
      network: {get_resource: csb_net}
      security_groups: [{get_resource: mog_security_group}]

  pd02_port_1:
    type: OS::Neutron::Port
    properties:
      network: {get_param: oam_net_name}
      fixed_ips: [{"ip_address": {get_param: [oam_net_ips, 1]}}]
      security_groups: [{get_resource: mog_security_group}]

  pd02_port_2:
    type: OS::Neutron::Port
    properties:
      network: {get_resource: dummy_net_0}
      security_groups: [{get_resource: mog_security_group}]

  pd02_port_3:
    type: OS::Neutron::Port
    properties:
      network: {get_param: rx_net_name}
      fixed_ips: [{"ip_address": {get_param: [rx_net_ips, 1]}}]
      allowed_address_pairs: [{"ip_address": {get_param: rx_net_floating_ip} }]
      security_groups: [{get_resource: mog_security_group}]

  pd02_port_4:
    type: OS::Neutron::Port
    properties:
      network: {get_resource: dummy_net_1}
      security_groups: [{get_resource: mog_security_group}]

  pd02_port_5:
    type: OS::Neutron::Port
    properties:
      network: {get_param: ran_net_name}
      fixed_ips: [{"ip_address": {get_param: [ran_net_ips, 1]}}]
      allowed_address_pairs: [{"ip_address": {get_param: ran_net_floating_ip} }]
      security_groups: [{get_resource: mog_security_group}]

  pd02_port_6:
    type: OS::Neutron::Port
    properties:
      network: {get_param: sl_net_name}
      fixed_ips: [{"ip_address": {get_param: [sl_net_ips, 1]}}]
      allowed_address_pairs: [{"ip_address": {get_param: sl_net_floating_ip}}]
      security_groups: [{get_resource: mog_security_group}]

 # pd02_port_7:
 #   type: OS::Neutron::Port
 #   properties:
    #  network: {get_param: internet_net_name}
    #  fixed_ips: [{"ip_address": {get_param: [internet_net_ips, 1]}}]
   #   allowed_address_pairs: [{"ip_address": {get_param: internet_net_floating_ip} }]
   #   security_groups: [{get_resource: mog_security_group}]

  servergroup_mog02:
    type: OS::Nova::ServerGroup
    properties:
      policies:
        - anti-affinity
  server_oam01:
    type: OS::Nova::Server
    properties:
#      config_drive: "True"
      name: {get_param: [oam_server_names, 0]}
      image: {get_param: oam_image_name}
      flavor: {get_param: oam_flavor_name}
      availability_zone: {get_param: availabilityzone_name}
      networks:
        - port: {get_resource: oam01_port_0}
        - port: {get_resource: oam01_port_1}
#      block_device_mapping:
#        - device_name: vdd
#          volume_id: { get_param: oam-vol-1 }
      user_data:
      scheduler_hints: {group: {get_resource: servergroup_mog02}}
      user_data_format:  RAW

  oam01_port_0:
    type: OS::Neutron::Port
    properties:
      network: {get_resource: csb_net}
      security_groups: [{get_resource: mog_security_group}]

  oam01_port_1:
    type: OS::Neutron::Port
    properties:
      network: {get_param: oam_net_name}
      fixed_ips: [{"ip_address": {get_param: [oam_net_ips, 2]}}]
      security_groups: [{get_resource: mog_security_group}]


  server_oam02:
    type: OS::Nova::Server
    properties:
#      config_drive: "True"
      name: {get_param: [oam_server_names, 1]}
      image: {get_param: oam_image_name}
      flavor: {get_param: oam_flavor_name}
      availability_zone: {get_param: availabilityzone_name}
      networks:
        - port: {get_resource: oam02_port_0}
        - port: {get_resource: oam02_port_1}
#      block_device_mapping:
#        - device_name: vdd
#          volume_id: { get_param: oam-vol-2 }
      user_data:
      scheduler_hints: {group: {get_resource: servergroup_mog02}}
      user_data_format:  RAW

  oam02_port_0:
    type: OS::Neutron::Port
    properties:
      network: {get_resource: csb_net}
      security_groups: [{get_resource: mog_security_group}]

  oam02_port_1:
    type: OS::Neutron::Port
    properties:
      network: {get_param: oam_net_name}
      fixed_ips: [{"ip_address": {get_param: [oam_net_ips, 3]}}]
      security_groups: [{get_resource: mog_security_group}]


  server_sm01:
    type: OS::Nova::Server
    properties:
#      config_drive: "True"
      name: {get_param: [sm_server_names, 0]}
      image: {get_param: sm_image_name}
      flavor: {get_param: sm_flavor_name}
      availability_zone: {get_param: availabilityzone_name}
      networks:
        - port: {get_resource: sm01_port_0}
        - port: {get_resource: sm01_port_1}
#      block_device_mapping:
#        - device_name: vdd
#          volume_id: { get_param: session-manager-vol-1 }
      user_data:
      scheduler_hints: {group: {get_resource: servergroup_mog02}}
      user_data_format:  RAW

  sm01_port_0:
    type: OS::Neutron::Port
    properties:
      network: {get_resource: csb_net}
      security_groups: [{get_resource: mog_security_group}]

  sm01_port_1:
    type: OS::Neutron::Port
    properties:
      network: {get_resource: dummy_net_0}
      security_groups: [{get_resource: mog_security_group}]

  sm01_port_2:
    type: OS::Neutron::Port
    properties:
      network: {get_param: repl_net_name}
      fixed_ips: [{"ip_address": {get_param: [repl_net_ips, 0]}}]
      security_groups: [{get_resource: mog_security_group}]

  server_sm02:
    type: OS::Nova::Server
    properties:
#      config_drive: "True"
      name: {get_param: [sm_server_names, 1]}
      image: {get_param: sm_image_name}
      flavor: {get_param: sm_flavor_name}
      availability_zone: {get_param: availabilityzone_name}
#      block_device_mapping:
#        - device_name: vdd
#          volume_id: { get_param: session-manager-vol-2 }
      networks:
        - port: {get_resource: sm02_port_0}
        - port: {get_resource: sm02_port_1}
      user_data:
      scheduler_hints: {group: {get_resource: servergroup_mog02}}
      user_data_format:  RAW

  sm02_port_0:
    type: OS::Neutron::Port
    properties:
      network: {get_resource: csb_net}
      security_groups: [{get_resource: mog_security_group}]

  sm02_port_1:
    type: OS::Neutron::Port
    properties:
      network: {get_resource: dummy_net_0}
      security_groups: [{get_resource: mog_security_group}]

  sm02_port_2:
    type: OS::Neutron::Port
    properties:
      network: {get_param: repl_net_name}
      fixed_ips: [{"ip_address": {get_param: [repl_net_ips, 1]}}]
      security_groups: [{get_resource: mog_security_group}]

  servergroup_mog03:
    type: OS::Nova::ServerGroup
    properties:
      policies:
        - anti-affinity
  server_ps01:
    type: OS::Nova::Server
    properties:
#      config_drive: "True"
      name: {get_param: [ps_server_names, 0]}
      image: {get_param: ps_image_name}
      flavor: {get_param: ps_flavor_name}
      availability_zone: {get_param: availabilityzone_name}
      networks:
        - port: {get_resource: ps01_port_0}
      user_data:
      scheduler_hints: {group: {get_resource: servergroup_mog03}}
      user_data_format:  RAW

  ps01_port_0:
    type: OS::Neutron::Port
    properties:
      network: {get_resource: csb_net}
      security_groups: [{get_resource: mog_security_group}]

  server_ps02:
    type: OS::Nova::Server
    properties:
#      config_drive: "True"
      name: {get_param: [ps_server_names, 1]}
      image: {get_param: ps_image_name}
      flavor: {get_param: ps_flavor_name}
      availability_zone: {get_param: availabilityzone_name}
      networks:
        - port: {get_resource: ps02_port_0}
      user_data:
      scheduler_hints: {group: {get_resource: servergroup_mog03}}
      user_data_format:  RAW

  ps02_port_0:
    type: OS::Neutron::Port
    properties:
      network: {get_resource: csb_net}
      security_groups: [{get_resource: mog_security_group}]

  server_ps03:
    type: OS::Nova::Server
    properties:
      name: {get_param: [ps_server_names, 2]}
      image: {get_param: ps_image_name}
      flavor: {get_param: ps_flavor_name}
      availability_zone: {get_param: availabilityzone_name}
      networks:
        - port: {get_resource: ps03_port_0}
      user_data:
      scheduler_hints: {group: {get_resource: servergroup_mog03}}
      user_data_format:  RAW

  ps03_port_0:
    type: OS::Neutron::Port
    properties:
      network: {get_resource: csb_net}
      security_groups: [{get_resource: mog_security_group}]

  server_ps04:
    type: OS::Nova::Server
    properties:
      name: {get_param: [ps_server_names, 3]}
      image: {get_param: ps_image_name}
      flavor: {get_param: ps_flavor_name}
      availability_zone: {get_param: availabilityzone_name}
      networks:
        - port: {get_resource: ps04_port_0}
      user_data:
      scheduler_hints: {group: {get_resource: servergroup_mog03}}
      user_data_format:  RAW

  ps04_port_0:
    type: OS::Neutron::Port
    properties:
      network: {get_resource: csb_net}
      security_groups: [{get_resource: mog_security_group}]

  server_cm01:
    type: OS::Nova::Server
    properties:
#      config_drive: "True"
      name: {get_param: [cm_server_names, 0]}
      image: {get_param: cm_image_name}
      flavor: {get_param: cm_flavor_name}
      availability_zone: {get_param: availabilityzone_name}
      networks:
        - port: {get_resource: cm01_port_0}
        - port: {get_resource: cm01_port_1}
#      block_device_mapping:
#        - device_name: vdd
#          volume_id: { get_param: cluster-manager-vol-2 }
#        - device_name: vde
#          volume_id: { get_param: cluster-manager-vol-1 }
      user_data:
      scheduler_hints: {group: {get_resource: servergroup_mog03}}
      user_data_format:  RAW

  cm01_port_0:
    type: OS::Neutron::Port
    properties:
      network: {get_resource: csb_net}
      fixed_ips: [{"ip_address": {get_param: [csb_net_ips, 10]}}]
      security_groups: [{get_resource: mog_security_group}]

  cm01_port_1:
    type: OS::Neutron::Port
    properties:
      network: {get_param: oam_net_name}
      fixed_ips: [{"ip_address": {get_param: [oam_net_ips, 4]}}]
      security_groups: [{get_resource: mog_security_group}]

